home *** CD-ROM | disk | FTP | other *** search
- unit link;
- {$o-,g-,d-,l-,y-,q-,r-,s-,t-,v-,x-,n-,e-,b-}
-
- INTERFACE
-
- type
- pstring=^string;
- pdata=^tdatarec;
- tdatarec=record
- name:pstring;
- size:byte;
- end;
- plink=^tlink;
- tlink=record
- prev,next:plink;
- data:pdata;
- end;
-
- procedure inilink(var l:plink);
- function addlink(var l:plink;var d:pdata):boolean;
- function addlink2(var l:plink;var d:string):boolean;
- procedure dellink(var l:plink);
- procedure linkdata(var l:plink;var p:pdata);
- function linkdata2(var l:plink):string;
- function numlinks(var l:plink):longint;
- procedure killink(var l:plink);
-
- IMPLEMENTATION
-
- procedure inilink(var l:plink);
- begin
- l^.prev:=nil; l^.next:=nil; l^.data:=nil; l:=nil;
- end;
-
- function addlink(var l:plink;var d:pdata):boolean;
- begin
- addlink:=false;
- if(memavail<(d^.size+16))then exit;
- if(l^.next=nil)then
- begin
- new(l^.next);
- l^.next^.next:=nil;
- l^.next^.prev:=l;
- new(l^.next^.data);
- getmem(l^.next^.data^.name,d^.size);
- l^.next^.data^.name^:='';
- l^.next^.data^.name^:=d^.name^;
- { l^.next^.data^.name^[0]:=d[0];}
- l^.next^.data^.size:=d^.size;
- end else
- begin
- freemem(l^.next^.data^.name,l^.next^.data^.size);
- getmem(l^.next^.data^.name,d^.size);
- l^.next^.data^.name^:=d^.name^;
- l^.next^.data^.size:=d^.size;
- end;
- addlink:=true;
- l:=l^.next;
- end;
-
- function addlink2(var l:plink;var d:string):boolean;
- begin
- addlink2:=false;
- if(memavail<(succ(ord(d[0])))+16)then exit;
- if(l^.next=nil)then
- begin
- new(l^.next);
- l^.next^.next:=nil;
- l^.next^.prev:=l;
- new(l^.next^.data);
- getmem(l^.next^.data^.name,succ(ord(d[0])));
- l^.next^.data^.name^:='';
- l^.next^.data^.name^:=d;
- l^.next^.data^.name^[0]:=d[0];
- l^.next^.data^.size:=succ(ord(d[0]));
- end else
- begin
- freemem(l^.next^.data^.name,l^.next^.data^.size);
- getmem(l^.next^.data^.name,succ(ord(d[0])));
- l^.next^.data^.name^:=d;
- l^.next^.data^.size:=succ(ord(d[0]));
- end;
- addlink2:=true;
- l:=l^.next;
- end;
-
- procedure dellink(var l:plink);
- var tmp:plink;
- begin
- tmp:=l;
- if((tmp^.prev=nil)and(tmp^.next=nil))or(tmp^.data=nil)then exit;
- if(tmp^.prev<>nil)and(tmp^.next<>nil)then tmp^.prev:=tmp^.next;
- if(tmp^.prev<>nil)and(tmp^.next<>nil)then tmp^.next^.prev:=tmp^.prev;
- l:=tmp^.next;
- freemem(tmp^.data^.name,tmp^.data^.size);
- dispose(tmp^.data);
- dispose(tmp);
- end;
-
- procedure linkdata(var l:plink;var p:pdata);
- begin
- if(p=nil)then
- begin
- new(p);
- new(p^.name);
- end;
- p^.name^:=l^.data^.name^;
- end;
-
- function linkdata2(var l:plink):string;
- var tmp:string;
- begin
- { tmp:=l^.data^.name^;
- linkdata2:=tmp; }
- move(l^.data^.name^[1],tmp[1],succ(l^.data^.size));
- tmp[0]:=char(pred(l^.data^.size));
- linkdata2:=tmp;
- end;
-
- function numlinks(var l:plink):longint;
- var
- tmp:plink;
- cnt:longint;
- begin
- numlinks:=0;
- if(l=nil)then exit;
- tmp:=l;
- while(tmp^.prev<>nil)do tmp:=tmp^.prev;
- cnt:=1;
- while(tmp^.next<>nil)do
- begin
- inc(cnt);
- tmp:=tmp^.next;
- end;
- numlinks:=cnt;
- end;
-
- procedure killink(var l:plink);
- var c:longint;
- begin
- while(l^.prev<>nil)do l:=l^.prev;
- for c:=1 to numlinks(l)do dellink(l);
- end;
-
- end.